/**
 * 请求封装
 * 官网文档：https://www.kancloud.cn/yunye/axios/234845
 * 设置全局的axios默认值,配置会以一个优先顺序进行合并。
 * 这个顺序是：在 lib/defaults.js 找到的库的默认值，然后是实例的 defaults 属性，最后是请求的 config 参数。后者将优先于前者
 * */
import axios from 'axios';
import {Loading, Message} from 'element-ui';
let loading = null;

// 配置默认值
axios.defaults.baseURL = 'http://127.0.0.1:8081';
axios.defaults.timeout = 30000;
axios.defaults.headers.common['Authorization'] = sessionStorage.getItem('token') || '';
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 开启加载动画
  loading = Loading.service({
    lock: true,
    text: 'Loading',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)'
  });
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // 结束加载动画
  loading.close();
  return response.data;
}, function (error) {
  // 对响应错误做点什么
  if (error && error.response) {
    let msg = '';
    switch (error.response) {
      case 400:
        msg = '请求错误';
        break;
      case 401:
        msg = '接口未授权';
        break;
      case 403:
        msg = '拒绝访问';
        break;
      case 404:
        msg = '接口不存在';
        break;
      case 405:
        msg = '请求方法错误';
        break;
      case 408:
        msg = '请求超时';
        break;
      case 500:
        msg = '服务器出错';
        break;
      case 502:
        msg = '网络错误';
        break;
      case 503:
        msg = '服务不可用';
        break;
      case 504:
        msg = '网络超时';
        break;
      case 505:
        msg = 'http版本不支持该请求';
        break;
      default:
        msg = `错误：${error.response}`
    }
    Message({
      message: msg,
      type: 'error'
    });
  }
  return Promise.reject(error);
});

export default axios;
